[ 1/6/24 ]
[h3]Old Journal Conversion:[/h3]
[b]They automatically convert when hovered over in your inventory.[/b]
Tweak: Old journals will be covered in blood to better identify them.
[i]Warning: Transcribe once after the journal is converted, just to be safe. More explanation on this later.[/i]
Patch: I've implemented a protection for 'oldXP' which will avoid boosting the old XP.
[i][b]Suggestion:[/b][/i] Read/transcribe into your journal, craft a new one, rinse/repeat.

[h3]Sandbox Options Change: The sandbox option for "Recover Profession And Traits Bonus XP" has been removed.[/h3]
- To clarify: BonusXP in this case refers to the additional XP earned from starting with more than 1 point in a skill. NOT the starting levels, the bonus XP earned.
- The default for this setting for this option was false anyway, and as such that XP was not recorded. All XP that was recorded was that of an unemployed/traitless character.
Going forward this XP will not be recorded, period. This resolves a lot of issues with the math involved, and keeps the XP even across the board.

[h3]XP Change: The XP in the journal going forward will be "raw" values.[/h3]
- With the term 'BonusXP' from above considered, starting level of 0 nets 25% of the raw value. (0=25%, 1=100%, 2=1.33%, 3=1.66%).
- Going forward reading will actually multiply the XP against the player's current XPBoostMap.
- This means the XP shown in your journal's tooltips will be different depending on the starting skills of who is reading it - but the raw-total will never fluctuate.

Fix: Modded skills now can be recorded again. :)
Fix: Issues with mods that change timed action speed should be fixed for good.
Added: A Gained XP counter in the skills menu - this shows the value of XP earned after character creation and what should be transcribed.
Added: Tooltip warning on journals for 'Use up XP' sandbox option.
[ ------ ]

[ 1/6/24 hotfix1 ]
Hotfix: Reading sandbox options properly.
Added: additional warning in tooltip to explain that XP is dependent on the person reading.
[ ------ ]

[ 1/6/24 hotfix2 ]
Hotfix: UltimateXPTweaker compatibility patch.
[ ------ ]

[ 1/6/24 hotfix3 ]
Hotfix: Fix issues with sandbox options not working, hide skills/recipes if sandbox doesn't allow them.
[ ------ ]

[ 1/9/24 hotfix4 ]
Fix: Edge case on the skills page.
Fix: Cannot read skills if the sandbox option is toggled off.
[ ------ ]

[ 1/19/24 ]
Fix: Recipes are now impacted by transcribe/read sandbox multipliers.
[ ------ ]

[ 5/18/24 ]
New: Tracks zombie and survivor kills, toggle via sandbox options. (0 to 100 %, default 0%)
Tweak: The sandbox options per skill category have been converted from true/false to (-1) to 100 %. -1 defaults the % to the general option.
Add: Logging for 'stop' reading events.
Fix: Allowing for modded skills to be disabled if the mod is removed.
[ ------ ]

[ 6/8/24 ]
Fix: Passive Skills setting default set back to 0 (Shouldn't have been -1).
[ ------ ]

[ 7/10/24 ]
Fix: Issue with transcribing Zombie/Survivor Kills across different journals.
Fix: Check for transcribing Survivor Kills in general.
[ ------ ]

[ 8/26/24 ]
Fix: Fitness/Weight conflict. The game will prevent gaining fitness XP if you're severely underweight - this caused issues where you could not recover your fitness back. Now you will need to regain some weight before continuing to read your journal.
Fix: Removed the 'All' option in transcribe.
Tweak/Fix: Changed how the recovery on kills is processed.
[ ------ ]

[ 8/26/24 HOTFIX 1 ]
Hotfix: Edge case with context overrides.
[ ------ ]

[ 12/23/24 ]
- Added % progress to reading/writing (MassCraxx)
- Changed `JournalCraft` sandbox option to `JournalCraftRecipe`
    - Takes a string and creates a recipe for crafting.
    - Leaving blank means journals can not be crafted.
- Added new option for mod-data support. Warning, this feature operates with a full overwrite.
- German Translation (credit to EagleFire).

B42:
 - Error Magnifier and Mod Update and Alert System are now hard required.
 - Sandbox options have been adjusted to match new categories of skills.
 - Writing is no longer a recipe.
[ ------ ]

[ 12/23/24 hotfix #1]
 - Fix issues with B41
[ ------ ]

[ 12/27/24 ]
B41: Fixed viewing the crafting recipe with mods that "fix" the crafting menu.
[ ------ ]

[ 12/27/24 #2 ]
B41: Fixed viewing the crafting recipe with mods that "fix" the crafting menu.
B42: Fixed Tags on Workshop page.
[ ------ ]

[ 1/12/25 ]
B42: Removed old conversion code from old journal type.
[ ------ ]

[ ALERT_CONFIG ]
link1 = Chuck's Kofi = https://steamcommunity.com/linkfilter/?u=https://ko-fi.com/chuckleberryfinn,
link2 = MassCraxx's Kofi = https://steamcommunity.com/linkfilter/?u=https://ko-fi.com/masscraxx,
link3 = Workshop = https://steamcommunity.com/id/Chuckleberry_Finn/myworkshopfiles/?appid=108600,
link4 = REPORT BUGS = https://chuckleberry-finn.github.io/issues/?repo=Skill-Recovery-Journal,
[ ------ ]

[ 1/24/25 ]
Fix tooltip render issue with fluid transferring.
Updated/fixed encodings for several languages.
[ ------ ]

[ 2/13/25 ]
Fixed Halotext bug caused by changes in B42.3.3
[ ------ ]

[ 2/16/25 ]
Added additional debug messages for recipe generation.
[ ------ ]

[ 6/27/25 ]
- Added checks for username to prevent/discourage sharing your Steam/Player accounts in order to cheat(???).
    (This affords prevention support to non-steam servers. This does not support local co-op.)
- Removed the decayed/conversion journal system.
    (This was for the transition period between how the journals recorded XP, see update from: 1/6/24)
[ ------ ]

[ 6/29/25 ]
- Added sandbox option to configure security-protections on journal use.
    1 = "Prevent Username/SteamID Mismatch"
    2 = "Only Prevent SteamID Mismatch"
    3 = "Don't Prevent Mismatches"
[ ------ ]


[ 8/15/25 ]
- Fixed B42 recipe learning issues.
Credit: anonpony1/pcgames3112.
[ ------ ]

[ 8/21/15 ]
- Fix issue allowing people to share kills/modData.
[ ------ ]

[ 8/25/25 ]
- Under the hood: Changed the update-check to a count-down (from a count-up).
   This should help avoid issues with timed-actions/craft-time changes being so fast it breaks the process.
[ ------ ]

[ 12/14/25 ]
- Add changes for 42.13 (by MassCraxx)
    - renaming lots of definitions, type in item def is now ItemType Tags, Traits and Professions are now constants and are used a bit differently
    - methods on character infos have moved like xpBoost info, some also got more convenient to use
    - free recipes from trait and profession now checked individually
    - fix getFreeLevelsFromTraitsAndProfession, now there can be 3 or more levels for 125% boost
    - fix recovery sandbox options, some category names have changed
    - fix lag on tooltips due to redundant overcalculation
    - re-add RecoverPassiveSkills as distinction from other PhysicalCategorySkills
    - use vanilla writing animation
[ ------ ]

[ 12/15/25 ]
- Add changes for 42.13 multiplayer (by MassCraxx)
    - move shared classes to shared space
    - send moddata changes made on write/read to server
    - (add light check for read/write)
    - sync with server on renaming journal, disable rename when not in inventory
[ ------ ]

[ 12/20/25 ]
- Restructure modData (by MassCraxx)
    - move all SRJ modData to unified table
    - sync only that table with server
    - general cleanup modData, remove legacy oldXp and background fix
[ ------ ]

[ 01/25/26 ]
- Changes for 42.13.2
- This update moves all manipulative actions to the server side.
    - transcription / read duration is now proportional to length of day set in sandbox vars.
    - read duration is now calculated the same way as transcription time, resulting in lower reading times compared to before
    - (passive) starting level for characters that existed before the mod was added will not be assumed to be 5, but is instead the current level of the character
    - tooltip on skill list now shows stored starting level
    - kills are now restored / recorded in chunks, just as xp
    - halo text percentage is now based on number of updates instead of processed xp, making it more linear and accurate
    - reading recipes may be a little slower
[ ------ ]

[ 01/27/26 ]
- fix localization in MP
- fix reading up to lvl 10
- improve kill recovery processing
- add twine to default recipe ingredients
- read and write are now handled by the same action
[ ------ ]

[ 01/28/26 ]
- fix derivation error for unix systems
- remove security check in single player
[ ------ ]

[ 02/10/26 ]
- Added custom mod-report for error magnifier.
   Includes useful info dump of mods, variables, sandbox-options, data.
- Fixed deduction and loose-XP info in skills window (SP only)
- Added some safety checks to the recipe sandbox option.
[ ------ ]

[ 03/09/26 ]
- Made it so the default functionality of the recipe is entirely a recipe-script.
   Script manipulation only occurs if the sandbox option for the recipe is not blank.
   This should avoid strange behaviors if you're not using a custom recipe.
- Tweaked the recipe to utilize items with the tags of "thread", "twine", "heavythread".
- Added B42.15 translations.
- Fixed errorMagnifier lookup for B42.15.

HotFix: B42.14 functionality restored.

WARNING: There's been alot of strange issues with Journals from before B42.12.
         We share the official recommendation of starting a new save with each new version of the game.
         If you wish to try your luck, at the very least craft a new journal and destroy the old one.
[ ------ ]

[ 3/25/26 ]
- B42.15 Json Translation.
[ ------ ]

[ 3/27/26 ]
- B42.15 Json Translation [hotfix]
  Fixed recipe name and item name use.
- Ran PZ-Translator v3.
[ ------ ]

[ 5/19/26 ]
Due to lack of reproducibility some extra measures were added to address the bugs reported:
- Transcribe-then-read XP exploit: server now syncs readXP state back to client after write completes.
  This should not be needed but there may be desync or delay between normal syncing.
- ReadXP table uses a local variable instead of itself, changes are applied after.
- Recipe chunk size now floors to a minimum of 1 - this should prevent infinite action loops in rare cases.
- Halotext progress percentage now capped at 100% visually.
- ModData copy moved to first action tick instead of initialization.
- Flat XP (addXpNoMultiplier) is now tracked separately and excluded from boost/unboost math during transcription.
   This should handle edge cases caused by other mods that add XP flatly, namely SOTO/More Traits.
- Custom recipe sandbox option has more safety checks to avoid invalid values.

Minor:
- Empty modData no longer marks a journal action tick as having changes.
- Kill restoration skips ticks after all kills are fully transferred (with other information still pending).
- SteamID is now assigned directly in identification checks.
- Illiterate feedback message used incorrect translation key.
[ ------ ]

[ 6/20/26 - HotFix 3 ]
- Fix: Strength/Fitness math issue introduced with the previous patch.
- More aggressive regex/sanity checks on the recipe option.
- Added incompatible mods to the mod.info

IT IS RECOMMENDED TO MAKE A NEW JOURNAL

HOTFIX 1: Fixed a typo in the recipe syntax check.
HOTFIX 2: Reworked the initialization for skills- slight revert to the old system, so data should be lost.
HOTFIX 3: Included a JSON paser used in Shops and Traders.
[ ------ ]

[ 7/7/26 ]
- Added a character-age check to the ledger system which was locking people out from their journals.
[ ------ ]

[ B42.20.2+ Update ]
Notice: B42.16 versioning has been moved to B42.19. B42.19 is also no longer supported and will remain as is.
Update: The mod is now Server-Authoritative!

- Fix: Read/Transcribe action that could loop forever and also fail on stop.
- Fix: Transcribing into a journal never actually saved the ledger - only Reading did. Both now save correctly.
- Fix: (?) BindSkillRecoveryJournal recipe for people forcing their B41 configs onto B42 and breaking their server. (???)
- Fix: ReadTimeSpeed is now actually applied to reading. Previously reading and writing both used TranscribeSpeed.
- Fix: Transcription checks pending kill-count progress, not just XP/recipes. A kills-only Transcribe should work fine.
- Cleaned-up old code.

New:
- Ledger system completely reworked to be server-authoritative:
  (Formerly the ledger system acted as a safety-check, now it is the entire system)
  - journals just carry a reference ID and display-only data
  - XP, recipes, kills now live server-side in one file per account (username)
    (SkillRecoveryJournal/<username>.txt)
  - Read XP is now also tracked server-side per life and sits at the top of the file

- Added Illiterate transcription/reading multiplier (default 0, illiterate can't use journals), upon request of Grimscribe. :)
- Made tooltip information on skill-progress bars non-debug.
   Added bars to reflect the gained XP's recoverable, un-transcribed, deducted, starting, status.

- Journals will need to migrate from the version prior to this one, migrated-XP cannot be read on the current life.

AS WITH ANY LARGE UPDATE TO THIS MOD OR THE BASE GAME,
  DESTROY OLD JOURNALS AND CRAFT NEW ONES FOR SAFE MEASURE!
[ ------ ]

[ B42.20.3 Hotfix ]
Fix: Rewrote the ledger-ID system to be even more server-sided
 - This should fix the XP resetting mid transcribe, but I was not able to recreate the issue on my end to confirm.
Fix: Progress bars for TV/VHS now reflect the current sandbox setting.
     (the XP was being transcribed/read but the bars displayed orange regardless.)
Tweak: Flooring internal XP values to their 2-decimal places for the sake of legibility.

If you want to avoid any possible interference with old data you should delete the SkillRecoveryJournal folder in your cache/Lua/. This applies to both single player and MP.

AS WITH ANY LARGE UPDATE TO THIS MOD OR THE BASE GAME,
  DESTROY OLD JOURNALS AND CRAFT NEW ONES FOR SAFE MEASURE!
[ ------ ]

[ 8/18/26 - B42.20.3 hotfix2 ]
BIG SHOUT OUT to the Sunday Drivers Community for helping with the closed Beta testing; Girth and Lect for subjugating their playerbase to frequent updates!

Tweak/Fix:  ReadXP no longer stored on the ledger, now on player object (server-side).
            The ledger is automatically purged, any fragmented ReadXPs are collapsed into 1 (taking the highest of each skill).
            The only data on the ledger's should be the contents of the journals.
            Migration is automatic upon logging in, you should not need to interact with the journal to trigger it.

Tweak/Fix: Recipes as a list no longer get sent over network, for display purposes just the length of the recipe list is sent.

AS WITH ANY LARGE UPDATE TO THIS MOD OR THE BASE GAME, DESTROY OLD JOURNALS AND CRAFT NEW ONES FOR SAFE MEASURE!
If you are still experiencing issues you should delete the SkillRecoveryJournal folder in your cache/Lua/. This applies to both single player and MP.
[ ------ ]

[ 9/3/26 - Hotfix 2 ]
HOTFIX 2: Fixed loading of ledger issue.
HOTFIX 1: Fixed less-than-edge case where the migration from txt could wipe the active json.

BIG FIX: There was an issue with saving files using non-ASCII characters, as such the system now escapes those characters. The purpose in using usernames for filenames was to make managing the ledgers easier for admin, but I had not accounted for non-ASCII. So, apologies to those regions that were impacted. As the filename will now be escaped (as well as the Author name) file sizes and data retrieval should become consistent and not bloat/corrupt.

Your current ledgers if you were using non-ASCII (Chinese, Japanese, Thai, Korean, Russian, etc) might not be able to be loaded, but the file is still there if you wish to fix the issues manually.

Added: Admin Manager Panel which allows admins to view, edit, save ledger contents; as well as spawn books matching the ledger.
Refactor: Ledgers will be read by line instead of by character (led to lag and performance drops coupled with the above big-issue.)
Fix: Transcription no longer interrupted if only 1 recipe chunk remains. (CoKeFish)
Fix: Added script manipulation on the server's end, only impacted people utilizing the custom craft recipe.
[ ------ ]